/*************************************************************************
** Name		: FileUtil.h
** Desc		: 常用文件操作
** Author	: xktesla
*************************************************************************/

#ifndef _74CBD99F_D76F_4202_BABD_4EA0241CC9AF
#define _74CBD99F_D76F_4202_BABD_4EA0241CC9AF

#include "depends/incfile.h"

namespace x2lib
{
	class FileUtil
	{
	public:
        /**
        * @brief        创建多层级目录
        * @param[in]    pszDirs 多层级目录字符串，不要求以“/”或“\”结尾
        * @return
        * @author       xktesla
        */
		static bool MakeDirs(const char *pszDirs);

		/**
		* @brief        遍历pszDirs下的文件和目录
		* @param[in]    pszDirs 待遍历的目录，不要求以“/”或“\”结尾
		* @param[in]    iDepth 查找子目录级别，小于0表示无限层级，1表示当前目录
		* @param[in]    enumProc 回调函数，返回值表示是否继续遍历，参数%0指示是否为文件，参数%1当前项，%2文件大小，%3用户指针
		* @param[in]    pVoid 用户指针
		* @return	    
		* @author       xktesla
		*/
		typedef bool(*ENUMFILESPROC)(bool, const char*, uint64_t, void*);
		static void EnumFiles(const char *pszDir, int depth, ENUMFILESPROC enumProc, void* userData);

		/**
		* @brief        获取文件大小
		* @param[in]    pszFile 文件路径
		* @return		文件大小
		* @author       xktesla
		*/
		static uint32_t GetFileSize(const char* pszFile);

		/**
		* @brief        拷贝文件
		* @param[in]    src 源文件
		* @param[in]    dst 目标文件
		* @param[in]    ignoreError 是否忽略拷贝过程中的错误
		* @return		是否成功
		* @author       xktesla
		*/
		static bool CopyDirFiles(const char* src, const char* dst, bool ignoreError);

		/**
		* @brief        存取文件
		* @param[in]    pszFile 文件路径
		* @param[inout] pData 欲写入或存放读取的内存指针
		* @param[in]	nData pData的大小
		* @param[in]    bRead true写入，false读出
		* @return		是否成功
		* @author       xktesla
		*/
		static bool ReadWrite(const char *pszFile, void *pData, int nData, bool bRead);

		/*************************************************************************
		** Desc		: 切换当前应用的工作目录
		** Param	: [curPath] 当前路径
		**			  [relativePath] 相对路径。
		**					“.”表示当前目录，“..”表示父目录
		**			  [curPathLen] curPath缓冲区大小
		**			  已淘汰！此函数已被ReckonDirectory替代 xktesla@2017-7-3 23:16:18
		** Return	: 成功返回true，失败返回false
		** Author	: xktesla
		*************************************************************************/
#if 0
		static bool ChangeDirectory(char *oldPath, char *newPath, char *szFull, int nFull);
		static bool TestDirectory(char *szDir, int mode = 0);
#endif
		/**
		* @brief        查找最后一个“/”或“\”
		* @param[in]    pszPath 路径字符串
		* @param[out]	slash 用于存储查找到的“/”或“\”
		* @return		最后一个“/”或“\”的索引，小于0表示未找到
		* @author       xktesla
		*/
		static int FindLastSlash(const char* pszPath, char* slash = nullptr);

		/**
		* @brief        判断pszPath是文件还是目录，或均不是
		* @param[in]    pszPath 路径字符串
		* @return		文件(1)，目录(-1)，非法(0)
		* @author       xktesla
		*/
		static int JudgeDirOrFile(const char* pszPath);

		/**
		* @brief        根据pszPath1和pszPath2推算pszPath3，如"C:\111\222"和"..\"得出"C:\111"
		* @param[in]    pszPath1 路径字符串
		* @param[in]    pszPath2 路径字符串
		* @param[out]	pszPath3 保存结果的缓冲区，若nullptr则使用函数内静态内存保存，此时多线程不安全
		* @return		返回推算出的结果，失败则返回nullptr
		* @author       xktesla
		*/
		static const char* CalculatePath(const char* pszPath1, const char* pszPath2, char* pszPath3 = nullptr);

		/**
		* @brief        删除文件，支持多层级目录
		* @param[in]    pszPath 路径字符串
		* @param[in]    isDelCurDir 是否删除当前目录
		* @return		
		* @author       xktesla
		*/
		static bool DeleteDirFiles(const char* pszPath, bool isDelCurDir);
	};

}

#endif

